/*
 * @Descripttion: 重构XMLHttpRequest方法
 * @Version: 1.0
 * @Author: undead
 * @Date: 2021-03-25 18:49:02
 * @LastEditors: undead
 * @LastEditTime: 2021-03-25 21:02:47
 */
var originSend = XMLHttpRequest.prototype.send;
var originOpen = XMLHttpRequest.prototype.open;

export default class HttpRequest {
    constructor() {
        const proptoTypes = Object.getPrototypeOf(this);
        for (let key in proptoTypes) {
            if (typeof proptoTypes[key] === "function") {
                XMLHttpRequest.prototype[key] = proptoTypes[key];
            }
        }
    }
    send() {
        var self: any = this;
        self.addEventListener("readystatechange", function () {
            if (this.readyState === 4 && this.status !== 200) {
                console.error(this.responseURL, RequestError[this.status], this.statusText);
            } else if(this.readyState === 4 && this.status === 200){
                console.log(this.responseURL, RequestError[this.status], this.statusText, arguments[0].timeStamp);
            }
        });
        // self.addEventListener("loadstart", function () {
        //     console.log("loadstart", this);
        // });
        // self.addEventListener("error", function () {
        //     console.log("error", this);
        // });
        // self.addEventListener("timeout", function () {
        //     console.log("timeout",this);
        // });
        // self.addEventListener("loadend", function () {
        //     console.log("loadend", this);
        // });
        originSend.apply(this, arguments);
    }
    open() {
        // sessionStorage[arguments[1]] = arguments[0]; 
        // console.warn(this, arguments.toString());
        originOpen.apply(this, arguments);
    }
}

 
class RequestError {
    static "100" = "客户必须继续发出请求";;
    static "101" = "客户要求服务器根据请求转换HTTP协议版本";
    static "200" = "获取数据成功";
    static "201" = "提示知道新文件的URL";
    static "202" = "接受和处理、但处理未完成";
    static "203" = "返回信息不确定或不完整";
    static "204" = "请求收到，但返回信息为空";
    static "205" = "服务器完成了请求，用户代理必须复位当前已经浏览过的文件";
    static "206" = "服务器已经完成了部分用户的GET请求";
    static "300" = "请求的资源可在多处得到";
    static "301" = "删除请求数据";
    static "302" = "在其他地址发现了请求数据";
    static "303" = "建议客户访问其他URL或访问方式";
    static "304" = "客户端已经执行了GET，但文件未变化";
    static "305" = "请求的资源必须从服务器指定的地址得到";
    static "306" = "前一版本HTTP中使用的代码，现行版本中不再使用";
    static "307" = "申明请求的资源临时性删除";
    static "400" = "错误请求，如语法错误";
    static "401" = "请求授权失败";
    static "402" = "保留有效ChargeTo头响应";
    static "403" = "请求不允许";
    static "404" = "没有发现文件、查询或URl";
    static "405" = "服务器禁止了使用当前 HTTP 方法的请求";
    static "406" = "根据用户发送的Accept拖，请求资源不可访问";
    static "407" = "类似401，用户必须首先在代理服务器上得到授权";
    static "408" = "客户端没有在用户指定的饿时间内完成请求";
    static "409" = "对当前资源状态，请求不能完成";
    static "410" = "服务器上不再有此资源且无进一步的参考地址";
    static "411" = "服务器拒绝用户定义的Content-Length属性请求";
    static "412" = "一个或多个请求头字段在当前请求中错误";
    static "413" = "请求的资源大于服务器允许的大小";
    static "414" = "请求的资源URL长于服务器允许的长度";
    static "415" = "请求资源不支持请求项目格式";
    static "416" = "请求中包含Range请求头字段，在当前请求资源范围内没有range指示值，请求也不包含If-Range请求头字段";
    static "417" = "服务器不满足请求Expect头字段指定的期望值，如果是代理服务器，可能是下一级服务器不能满足请求";
    static "500" = "服务器产生内部错误";
    static "501" = "服务器不支持请求的函数";
    static "502" = "服务器暂时不可用，有时是为了防止发生系统过载";
    static "503" = "服务器过载或暂停维修";
    static "504" = "关口过载，服务器使用另一个关口或服务来响应用户，等待时间设定值较长";
    static "505" = "服务器不支持或拒绝支请求头中指定的HTTP版本";
}